let ErrorUtils = require('../utils/error/ErrorUtils');
let {Storage, Teacher} = require('../models');
const {infoLogger, errorLogger,con} = require('../config').logger;
const Joi = require('joi');
const perpage = 10;
const lodash = require('lodash');

/**
 * joi git地址https://github.com/hapijs/joi/blob/master/examples/timestamps.js
 */
class TeacherService {
    /**
     * 城市添加
     * @returns {Promise<*>}
     */
    static async index(id) {
        infoLogger.info(">>>>>获取城市添加开始");
        return await Teacher.findById(id);
    }

    /**
     * 获取城市列表
     * @returns {Promise<void>}
     */
    static async list(storeId, page) {
        infoLogger.info(">>>>>获取店铺列表开始");
        infoLogger.info('店铺id:' + storeId + '页数' + page);
        con.info('店铺id:' + storeId + '页数' + page);
        if (!page) {
            page = 1;
        }
        page = parseInt(page);
        if (isNaN(page)) {
            ErrorUtils.throwApiError(ErrorUtils.REQUEST_ERROR);
        }
        let skip = (page - 1) * perpage;
        let result = await Teacher
            .find()
            .where('storeId', storeId)
            .skip(skip)
            .limit(perpage)
            .lean()
            .exec();
        // if (result) {
        //     for (let i = 0; i < result.length; i++) {
        //         result[i]['logo'] = result[i]['logo'].replace('public/', '');
        //     }
        // }
        return result;
    }


    /**
     * 获取教练列表
     * @returns {Promise<void>}
     */
    static async list1(storeId) {
        infoLogger.info(">>>>>获取教练列表开始");
        let result = await Teacher
            .find()
            .where('storeId', storeId)
            .limit(40)
            .lean()
            .exec();
        return result;
    }
    /**
     * 获取教练详情
     * @returns {Promise<*>}
     */
    static async detail(id) {
        if(!id){
            ErrorUtils.throwApiError(ErrorUtils.ID_INVALID);
        }
        infoLogger.info(">>>>>获取教练详情");
        return await Teacher.findById(id);
    }

    static checkTeacherData(data) {
        let schema = Joi.object({
            username: Joi.string().min(1).max(20).required(),
            des: Joi.string().min(1).max(100).required(),
            logo: Joi.string().min(10).max(100).required(),
            startTime: Joi.string().required(),
            endTime: Joi.string().required(),
            timeList: Joi.array().items(
                Joi.number().required(),
            ).required(),
            phone: Joi.string().min(11).max(11).required(),
            storeId: Joi.string().min(10).max(40).required(),
            typeList:Joi.array().items().required(),
            // jjPrice: Joi.object().keys({
            //     price: Joi.number().min(0).required(),
            //     isChoose: Joi.boolean().required(),
            // }),
            // hxPrice: Joi.object().keys({
            //     price: Joi.number().min(0).required(),
            //     isChoose: Joi.boolean().required(),
            // }),
            // priceList: Joi.array().items(
            //     Joi.object().keys({
            //         time: Joi.date().timestamp().required(),
            //         price: Joi.number().min(0).required(),
            //     }),
            // ).required(),
        });
        //url https://www.jianshu.com/p/e6e277c1fda2
        /**
         * 参数校验
         * @param {Object} checkInfo 要校验的对象
         * @param {Object} schema 参数校验
         * @param {Object} option 可选项
         * @param {Boolean} option.abortEarly: 设置 true，可以在检测到第一个错误时立即返回，默认 false(检查全部)。推荐设置 true
         * @param {Boolean} option.convert:设置 true，可以尝试将值转换为所需的类型(例如，将字符串转换为数字）。默认为 true。推荐采用默认
         * @param {Boolean} option.allowUnknown: 默认 false，则允许对象包含被忽略的未知键。默认为 false。推荐设置 true
         * @param {Boolean} option.skipFunctions:如果为 true，则忽略具有函数值的未知键。默认为 false。推荐采用默认
         * @param {Boolean} option.stripUnknown: 默认为 false,从对象和数组中删除未知的元素。默认为 false。也可以特殊的设置成 { objects: true , arrays: true }的形式，可以对象和数组分别处理。推荐采用默认
         * @param {String} option.presence: 设置默认的可选需求。支持的模式:’optional’,’required’,和 ’forbidden’。默认为 ’optional’。推荐采用默认
         * @param {Boolean} option.escapeHtml: 当为 true时，出于安全目的，错误消息模板将特殊字符转义为html实体。默认为 false。推荐采用默认
         * @param {Boolean} option.noDefaults:如果为 true，则不应用默认值。默认为 false。推荐采用默认
         */

        const option = {
            allowUnknown: true,
            abortEarly: true,
        };
        let result = Joi.validate(data, schema, option);
        return result;
    }

    /**
     * 理发师添加
     * @returns {Promise<*>}
     */
    static async create(data) {
        infoLogger.info(">>>>>添加理发师开始,请求数据",data);
        await TeacherService.checkTeacherData(data);
        let result = await Teacher.findOne({username: data.username,storeId:data.storeId});
        if (result) {
            ErrorUtils.throwApiError(ErrorUtils.DATA_EXIST);
        }
        return await Teacher.create(data);
    }

    /**
     * 城市添加
     * @returns {Promise<*>}
     */
    static async update(data) {
        infoLogger.info(">>>>>教练修改开始,请求数据",data);
        let id = data._id;
        if (!id) {
            ErrorUtils.throwApiError(ErrorUtils.ID_INVALID);
        }
        data = lodash.omit(data, ['id', '_id','updatedAt','createdAt','deletedAt']);
        await TeacherService.checkTeacherData(data);

        let result = await Teacher.findById(id);
        if (!result) {
            ErrorUtils.throwApiError(ErrorUtils.DATA_NOT_EXIST);
        }
        result = await Teacher.updateOne({_id: id}, data);
        return result;

    }

    /**
     * 城市删除
     * @returns {Promise<*>}
     */
    static async delete(id) {
        infoLogger.info(">>>>>获取城市添加开始");
        if (!id) {
            return false;
        }
        await Teacher.remove({_id: id});
        return true;
    }
}

module.exports = TeacherService;
